home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / d2_dictionary.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  3KB  |  105 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  d2_dictionary.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #ifndef LEDA_d2_dictionary_H
  17. #define LEDA_d2_dictionary_H
  18.  
  19. #include <LEDA/impl/range_tree.h>
  20. typedef rt_item dic2_item;
  21.  
  22.  
  23.  
  24. template<class type1, class type2, class itype>
  25. class _CLASSTYPE d2_dictionary : public range_tree {
  26.  
  27.   // redefine the virtual functions of class range_tree
  28.  
  29.   void rt_clear_key(GenPtr*& x) const { 
  30.     Clear(ACCESS(type1,x[0])); Clear(ACCESS(type2,x[1])); 
  31.   }
  32.  
  33.   void rt_copy_key(GenPtr*& x) const { 
  34.     Copy(ACCESS(type1,x[0])); Copy(ACCESS(type2,x[1])); 
  35.   }
  36.  
  37.   void rt_print_key(int d,GenPtr*& x) const { 
  38.     if( d==0 ) Print(ACCESS(type1,x[0]),cout);
  39.     else       Print(ACCESS(type2,x[1]),cout);
  40.   }
  41.   
  42.   void rt_clear_inf(GenPtr& x) const  { Clear(ACCESS(itype,x));}
  43.   void rt_copy_inf(GenPtr& x)  const { Copy(ACCESS(itype,x));}
  44.   
  45.   int rt_cmp(int d,GenPtr* x,GenPtr* y) const { 
  46.     if( d==0 ) return compare(ACCESS(type1,x[0]),ACCESS(type1,y[0]));
  47.     else       return compare(ACCESS(type2,x[1]),ACCESS(type2,y[1]));
  48.   }
  49.   
  50.   range_tree* new_range_tree(int /*dim*/, int lev ) { 
  51.     return new d2_dictionary<type1,type2,itype>(lev); 
  52.   }
  53.  
  54.   public:
  55.   
  56.     d2_dictionary(int lev=0) : range_tree(2,lev) {}
  57.     ~d2_dictionary() { clear(); }
  58.     
  59.     itype inf(dic2_item x)    { return ACCESS(itype,x->inf());}
  60.     
  61.     type1 key1(dic2_item x)   { return ACCESS(type1,x->key(0));  }
  62.     type2 key2(dic2_item x)   { return ACCESS(type2,x->key(1));  }
  63.     
  64.     void  change_inf(dic2_item x, itype i) { 
  65.       Clear(ACCESS(itype,x->inf())); 
  66.       x->inf() = Copy(i); 
  67.     }
  68.     
  69.     dic2_item min_key1() { return range_tree::rt_min(0); }
  70.     dic2_item min_key2() { return range_tree::rt_min(1); }
  71.     dic2_item max_key1() { return range_tree::rt_max(0); }
  72.     dic2_item max_key2() { return range_tree::rt_max(1); }
  73.     
  74.     dic2_item insert(type1 x,type2 y,itype i) { 
  75.       dic2_item p = new rt_elem(Copy(x),Copy(y),Copy(i));
  76.       return range_tree::insert(p);
  77.      }
  78.     
  79.     list<dic2_item> range_search(type1 x0,type1 x1,type2 y0,type2 y1) { 
  80.       rt_elem p(Convert(x0),Convert(y0),0);
  81.       rt_elem q(Convert(x1),Convert(y1),0);
  82.       return range_tree::query(&p,&q);
  83.     }
  84.     
  85.     dic2_item lookup(type1 x,type2 y) { 
  86.       rt_elem p(Convert(x),Convert(y),0);
  87.       return range_tree::lookup(&p);
  88.     }
  89.     
  90.     void del(type1 x,type2 y) { 
  91.       rt_elem p(Convert(x),Convert(y),0);
  92.       range_tree::del(&p);
  93.     }
  94.     
  95.     void del_item(dic2_item it) { range_tree::del(it); }
  96.     list<dic2_item> all_items() { return range_tree::all_items(); }
  97. };
  98.  
  99. // iteration macro
  100. // 
  101. #define forall_dic2_items(x,T)  (T).init_iteration(); forall(x,(T).L )
  102.  
  103. #endif
  104.